package com.storage.system.service;

import com.alibaba.fastjson.JSONObject;
import com.storage.common.core.domain.AjaxResult;
import com.storage.common.core.domain.ServiceResponse;
import com.storage.common.core.page.TableDataInfo;
import com.storage.system.domain.StorageBrand;
import com.storage.system.domain.StorageProduct;
import com.storage.system.domain.StorageUser;
import com.storage.system.domain.StorageUserAgent;

import java.util.List;
import java.util.Map;

/**
 * 用户 服务层
 *
 * @author storage
 * @date 2019-08-18
 */
public interface IStorageUserService {
    
    /**
     * 查询用户信息
     *
     * @param id 用户ID
     * @return 用户信息
     */
    public StorageUser selectStorageUserById(Long id);

    /**
     * 查询用户列表
     *
     * @param storageUser 用户信息
     * @return 用户集合
     */
    public ServiceResponse<TableDataInfo> selectStorageUserList(StorageUser storageUser, Integer pageNum, Integer pageSize);

    /**
     * 新增用户
     *
     * @param storageUser 用户信息
     * @return 结果
     */
    public AjaxResult insertStorageUser(StorageUser currentUser, StorageUser storageUser);

    /**
     * 修改用户
     *
     * @param storageUser 用户信息
     * @return 结果
     */
    public ServiceResponse<StorageUser> updateStorageUser(StorageUser currentUser, StorageUser storageUser);

    /**
     * 删除用户信息
     *
     * @param ids 需要删除的数据ID
     * @return 结果
     */
    public int deleteStorageUserByIds(String ids);

    /**
     * 通过手机号码查询用户
     *
     * @param phoneNumber 手机号码
     * @return 用户对象信息
     */
    public StorageUser selectUserByPhoneNumber(String phoneNumber);

    /**
     * 通过邮箱查询用户
     *
     * @param email 邮箱
     * @return 用户对象信息
     */
    public StorageUser selectUserByEmail(String email);

    /**
     * 根据微信code查询用户信息
     *
     * @param wxCode
     * @return
     */
    public StorageUser selectStorageUserByWxCode(String wxCode);

    /**
     * 查询用户-代理商列表
     *
     * @param currentUser
     * @param level
     * @return
     */
    public ServiceResponse<TableDataInfo> selectStorageUserAgentList(StorageUser currentUser, Integer level, String type, Integer pageNum, Integer pageSize);

    /**
     * 新增保存用户-代理商
     */
    public ServiceResponse<StorageUserAgent> insertStorageUserAgent(StorageUser currentUser, StorageUserAgent storageUserAgent);

    /**
     * 新增保存用户-代理商
     */
    public AjaxResult updateStorageUserAgent(StorageUser currentUser, StorageUserAgent storageUserAgent);

    /**
     * 根据业务员编码查询用户
     *
     * @param businessCode
     * @return
     */
    StorageUser selectUserByBusinessCode(String businessCode);

    /**
     * 删除代理商
     *
     * @param ids
     * @return
     */
    ServiceResponse<Boolean> deleteStorageUserAgentByIds(StorageUser currentUser, Integer level, String ids);

    /**
     * 更新是否开放库存查看状态给指定代理商
     *
     * @param agentId 代理商id
     * @param show    代理商查看当前用户库存权限: 0-不允许代理商查看;1-允许代理商查看库存
     * @return
     */
    AjaxResult markStockShowStatus(StorageUser storageUser, Long agentId, int show);

    /**
     * 获取店铺创建人信息
     *
     * @param storageUser
     * @return
     */
    ServiceResponse<StorageUser> getShopCreatorInfo(StorageUser storageUser);

    /**
     * 查询业务员列表
     *
     * @param storageUser
     * @param pageNum
     * @param pageSize
     * @return
     */
    ServiceResponse<TableDataInfo> selectStorageBusinessUserList(StorageUser currentUser, StorageUser storageUser, Integer pageNum, Integer pageSize);

    /**
     * 根据agentId和level获取代理商关联关系
     *
     * @param level
     * @param agentId
     * @return
     */
    ServiceResponse<List<StorageBrand>> getAgentBrands(StorageUser storageUser, Integer level, Long agentId);

    /**
     * 获取当前用户推荐人
     *
     * @param storageUser
     * @return
     */
    ServiceResponse<StorageUser> getRecommendBusinessUser(StorageUser storageUser);

    /**
     * 是否有未确认订单和未读消息
     *
     * @param storageUser
     * @return
     */
    ServiceResponse<JSONObject> haveExistsUnConfirmOrderAndUnReadMessage(StorageUser storageUser);

    /**
     * 获取当前代理商自己库存中的品牌
     *
     * @param storageUser
     * @return
     */
    ServiceResponse<List<JSONObject>> getAgentSelfBrands(StorageUser storageUser, String brandName);
}
